package iface.aplicativo.apresentacao.controle;

import iface.aplicativo.excecao.MensagemException;
import iface.aplicativo.negocio.aps.ManterReceitasAPS;
import iface.aplicativo.negocio.entidade.Categoria;
import iface.aplicativo.negocio.entidade.Conta;
import iface.aplicativo.negocio.entidade.FormaPagamento;
import iface.aplicativo.negocio.entidade.Lancamento;
import iface.aplicativo.negocio.entidade.LancamentoItem;
import iface.aplicativo.negocio.entidade.Pessoa;
import iface.aplicativo.negocio.entidade.Veiculo;
import iface.aplicativo.to.ContasTO;
import iface.aplicativo.to.SituacaoContasTO;
import iface.aplicativo.util.BeanAbstrato;
import iface.aplicativo.util.DataUtilitario;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.model.SelectItem;

@ManagedBean
@SessionScoped
public class ManterReceitasBean extends BeanAbstrato implements Serializable {

	private static final long serialVersionUID = 4285899560377776076L;

	private Date dataContas;
	private Date dataVencimentoInicial;
	private Date dataVencimentoFinal;
	private String mesAnoContas;

	private SituacaoContasTO situacaoContasTO;
	private ContasTO contasPagarTO;
	private ContasTO contasReceberTO;

	private Lancamento lancamento;
	private Lancamento lancamentoAux;

	@ManagedProperty(value = "#{manterReceitasAPS}")
	private ManterReceitasAPS service;

	public void setService(ManterReceitasAPS service) {
		this.service = service;
	}

	public void mesAnterior() {
		dataContas = DataUtilitario.adiconarMeses(dataContas, -1);
	}

	public void mesProximo() {
		dataContas = DataUtilitario.adiconarMeses(dataContas, 1);
	}

	public void mesAtual() {
		dataContas = new Date();
	}

	public void atualizarContasPagar() {
		try {
			contasPagarTO = this.service.atualizarContasPagar(this
					.getDataContas());

		} catch (final MensagemException e) {
			this.setMensagem(e.getMessage(), MSG_TIPO_AVISO, "");
		} catch (final Exception e) {
			this.setMensagem(e.getMessage(), MSG_TIPO_ERRO, "");
		}
	}

	public void atualizarContasReceber() {
		try {
			contasReceberTO = this.service.atualizarContasReceber(this
					.getDataContas());

		} catch (final MensagemException e) {
			this.setMensagem(e.getMessage(), MSG_TIPO_AVISO, "");
		} catch (final Exception e) {
			this.setMensagem(e.getMessage(), MSG_TIPO_ERRO, "");
		}
	}

	public void baixarLancamento() throws Exception {
		try {
			String msg = this.service.baixarLancamento(this.getLancamento());

			this.setMensagem(msg, MSG_TIPO_INFORMACAO, "");
		} catch (final MensagemException e) {
			this.setMensagem(e.getMessage(), MSG_TIPO_AVISO, "");
		} catch (final Exception e) {
			this.setMensagem(e.getMessage(), MSG_TIPO_ERRO, "");
		}
	}

	public String novoLancamento() throws Exception {
		return "manterlancamentos/inicial";
	}

	public void limparCampos() throws Exception {
		this.setDataVencimentoInicial(null);
		this.setDataVencimentoFinal(null);
		this.setSituacaoContasTO(null);
	}

	public Collection<Lancamento> getTodosLancamentos() {
		return this.service.consultarTodosLancamentos();
	}

	public Collection<Lancamento> getTodosLancamentosPorFiltro() {
		return this.service.consultarLancamentosPorFiltro(
				dataVencimentoInicial, dataVencimentoFinal, situacaoContasTO);
	}

	public Collection<Conta> getObterContasAtualizadas() {
		return this.service.getObterContasAtualizadas();
	}

	public List<SelectItem> getConsultarPeriodos() {
		return this.service.consultarPeriodos();
	}

	public Lancamento getLancamento() {
		if (lancamento == null) {
			lancamento = new Lancamento();
			lancamento.setCategoria(new Categoria());
			lancamento.setConta(new Conta());
			lancamento.setFormaPagamento(new FormaPagamento());
			lancamento.setPessoa(new Pessoa());
			lancamento.setVeiculo(new Veiculo());
			lancamento.setLancamentoItems(new ArrayList<LancamentoItem>());
		}
		this.setLancamento(lancamento);
		return lancamento;
	}

	public void setLancamento(Lancamento lancamento) {
		if (lancamento != null) {
			if (lancamento.getCategoria() == null) {
				lancamento.setCategoria(new Categoria());
			}
			if (lancamento.getConta() == null) {
				lancamento.setConta(new Conta());
			}
			if (lancamento.getFormaPagamento() == null) {
				lancamento.setFormaPagamento(new FormaPagamento());
			}
			if (lancamento.getPessoa() == null) {
				lancamento.setPessoa(new Pessoa());
			}
			if (lancamento.getVeiculo() == null) {
				lancamento.setVeiculo(new Veiculo());
			}
		}
		this.lancamento = lancamento;
	}

	public Lancamento getLancamentoAux() {
		if (lancamentoAux == null) {
			lancamentoAux = new Lancamento();
			lancamentoAux.setCategoria(new Categoria());
			lancamentoAux.setConta(new Conta());
			lancamentoAux.setFormaPagamento(new FormaPagamento());
			lancamentoAux.setPessoa(new Pessoa());
			lancamentoAux.setVeiculo(new Veiculo());
			lancamentoAux.setLancamentoItems(new ArrayList<LancamentoItem>());
		}
		return lancamentoAux;
	}

	public void setLancamentoAux(Lancamento lancamentoAux) {
		this.lancamentoAux = lancamentoAux;
	}

	public Date getDataVencimentoFinal() {
		return dataVencimentoFinal;
	}

	public void setDataVencimentoFinal(Date dataVencimentoFinal) {
		this.dataVencimentoFinal = dataVencimentoFinal;
	}

	public Date getDataVencimentoInicial() {
		return dataVencimentoInicial;
	}

	public void setDataVencimentoInicial(Date dataVencimentoInicial) {
		this.dataVencimentoInicial = dataVencimentoInicial;
	}

	public String getMesAnoContas() {
		int mes = DataUtilitario.getMes(getDataContas()) + 1;
		mesAnoContas = "" + (mes < 10 ? "0" + mes : mes) + "/"
				+ +DataUtilitario.getAno(getDataContas());
		return mesAnoContas;
	}

	public void setMesAnoContas(String mesAnoContas) {
		this.mesAnoContas = mesAnoContas;
	}

	public Date getDataContas() {
		if (dataContas == null) {
			dataContas = new Date();
		}
		return dataContas;
	}

	public void setDataContas(Date dataContas) {
		this.dataContas = dataContas;
	}

	public ContasTO getContasPagarTO() {
		if (contasPagarTO == null) {
			contasPagarTO = new ContasTO();
		}
		this.atualizarContasPagar();
		return contasPagarTO;
	}

	public void setContasPagarTO(ContasTO contasPagarTO) {
		this.contasPagarTO = contasPagarTO;
	}

	public ContasTO getContasReceberTO() {
		if (contasReceberTO == null) {
			contasReceberTO = new ContasTO();
		}
		this.atualizarContasReceber();
		return contasReceberTO;
	}

	public void setContasReceberTO(ContasTO contasReceberTO) {
		this.contasReceberTO = contasReceberTO;
	}

	public SituacaoContasTO getSituacaoContasTO() {
		if (situacaoContasTO == null) {
			situacaoContasTO = new SituacaoContasTO();
		}
		return situacaoContasTO;
	}

	public void setSituacaoContasTO(SituacaoContasTO situacaoContasTO) {
		this.situacaoContasTO = situacaoContasTO;
	}

}
